module top (
    input clk,
    input rst_n,
    inout dq,
    input [3:0] key_in,
    input rx,
    output tx,
    output [5:0] sel,
    output [7:0] dig,
    output wire [3:0] led,
    output buzzer


);

    wire beep_en;
    wire rx_data_vld;


/********************************************     按键控制 LED    *********************************************/
    // 按键
    wire [3:0] key_out;
    FSM_KEY inst_FSM_KEY (
        .clk                (clk),
        .rst_n              (rst_n),
        .key_in             (key_in[3:0]),
        .key_out            (key_out[3:0])
    );

    reg [3:0] en_led;

    // 按键按下一次 对应的en取反
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)    en_led <= 4'b0000; 
        else if (key_out == 4'b0001) en_led <= {en_led[3:1],~en_led[0:0]};
        else if (key_out == 4'b0010) en_led <= {en_led[3:2],~en_led[1:1],en_led[0:0]};
        else if (key_out == 4'b0100) en_led <= {en_led[3:3],~en_led[2:2],en_led[1:0]};
        else if (key_out == 4'b1000) en_led <= {~en_led[3:3],en_led[2:0]};
        else en_led <= en_led;
    end
/********************************************     按键控制 LED    *********************************************/
wire ste_tem_err;
get_state inst_get_state_tem (
    .clk                (clk),
    .rst_n              (rst_n),
    .a                  (en_led[3:3]),
    .b                  (beep_en),
    .res                (ste_tem_err)
);


wire ste_pfs_err;
get_state inst_get_state_pfs (
    .clk                (clk),
    .rst_n              (rst_n),
    .a                  (en_led[2:2]),
    .b                  (rx_data_vld),
    .res                (ste_pfs_err)
);




/********************************************     LED 相关   *********************************************/
    assign  led[3:3] = en_led[0:0];     // 第一个灯---> 门禁开关
    assign  led[2:2] = en_led[1:1];     // 第二个灯---> 排风扇开关
    // assign  led[1:1] = en_led[2:2];  // 第三个灯---> 排风扇故障开关
    // assign  led[0:0] = en_led[3:3];  // 第四个灯---> 温度异常开关

//   第三个灯---> 排风扇故障开关
    led_1s inst_led_3 (
        .clk                (clk),
        .rst_n              (rst_n),
        .en                 (ste_pfs_err),
        .led                (led[1:1])
    );

//  第四个灯---> 温度异常开关
    led_1s inst_led_4 (
        .clk                (clk),
        .rst_n              (rst_n),
        .en                 (ste_tem_err),
        .led                (led[0:0])
    );
/********************************************     LED 相关   *********************************************/





    // 串口接收数据

    wire [7:0] rx_data;
    uart_rx inst_uart_rx (
        .clk                (clk),
        .rst_n              (rst_n),
        .din                (rx),
        .dout               (rx_data),
        .dout_vld           (rx_data_vld)
    );

    // 串口发送数据
    wire [15:0] t_data;
    wire [23:0] dis_data;
    wire [7:0] t_data_uart; // 通过串口发送的数据到PC






    beep_hh inst_beep_hh (
        .clk                (clk),
        .rst_n              (rst_n),module top (
    input clk,
    input rst_n,
    inout dq,
    input [3:0] key_in,
    input rx,
    output tx,
    output [5:0] sel,
    output [7:0] dig,
    output wire [3:0] led,
    output buzzer


);

    wire beep_en;
    wire rx_data_vld;


/********************************************     按键控制 LED    *********************************************/
    // 按键
    wire [3:0] key_out;
    FSM_KEY inst_FSM_KEY (
        .clk                (clk),
        .rst_n              (rst_n),
        .key_in             (key_in[3:0]),
        .key_out            (key_out[3:0])
    );

    reg [3:0] en_led;

    // 按键按下一次 对应的en取反
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)    en_led <= 4'b0000; 
        else if (key_out == 4'b0001) en_led <= {en_led[3:1],~en_led[0:0]};
        else if (key_out == 4'b0010) en_led <= {en_led[3:2],~en_led[1:1],en_led[0:0]};
        else if (key_out == 4'b0100) en_led <= {en_led[3:3],~en_led[2:2],en_led[1:0]};
        else if (key_out == 4'b1000) en_led <= {~en_led[3:3],en_led[2:0]};
        else en_led <= en_led;
    end
/********************************************     按键控制 LED    *********************************************/
wire ste_tem_err;
get_state inst_get_state_tem (
    .clk                (clk),
    .rst_n              (rst_n),
    .a                  (en_led[3:3]),
    .b                  (beep_en),
    .res                (ste_tem_err)
);


wire ste_pfs_err;
get_state inst_get_state_pfs (
    .clk                (clk),
    .rst_n              (rst_n),
    .a                  (en_led[2:2]),
    .b                  (rx_data_vld),
    .res                (ste_pfs_err)
);




/********************************************     LED 相关   *********************************************/
    assign  led[3:3] = en_led[0:0];     // 第一个灯---> 门禁开关
    assign  led[2:2] = en_led[1:1];     // 第二个灯---> 排风扇开关
    // assign  led[1:1] = en_led[2:2];  // 第三个灯---> 排风扇故障开关
    // assign  led[0:0] = en_led[3:3];  // 第四个灯---> 温度异常开关

//   第三个灯---> 排风扇故障开关
    led_1s inst_led_3 (
        .clk                (clk),
        .rst_n              (rst_n),
        .en                 (ste_pfs_err),
        .led                (led[1:1])
    );

//  第四个灯---> 温度异常开关
    led_1s inst_led_4 (
        .clk                (clk),
        .rst_n              (rst_n),
        .en                 (ste_tem_err),
        .led                (led[0:0])
    );
/********************************************     LED 相关   *********************************************/





    // 串口接收数据

    wire [7:0] rx_data;
    uart_rx inst_uart_rx (
        .clk                (clk),
        .rst_n              (rst_n),
        .din                (rx),
        .dout               (rx_data),
        .dout_vld           (rx_data_vld)
    );

    // 串口发送数据
    wire [15:0] t_data;
    wire [23:0] dis_data;
    wire [7:0] t_data_uart; // 通过串口发送的数据到PC






    beep_hh inst_beep_hh (
        .clk                (clk),
        .rst_n              (rst_n),
        .key_in             (ste_tem_err),
        .pwm                (buzzer)
    );





    ds18b20_driver inst_ds18b20_Driver(
        .clk    (clk)  ,
        .rst_n  (rst_n),
        .dq     (dq)  , 
        .t_data (t_data)   
    );


    sel_driver inst_sel_driver (
        .clk                (clk),
        .rst_n              (rst_n), 
        .dis_data           (dis_data),         
        .sel                (sel),     
        .dig                (dig)  
    );
    // 计数 20 us
    parameter TIME_20us = 28'd 400;
    

    ctrl inst_strl (

    .t_data    (t_data),
    .dis_data   (dis_data),
    .en         (beep_en),
    .clk        (clk),
    .rst_n      (rst_n),
    .tx1         (tx)
    );


    // assign t_data_uart = {1'b0,t_data[10:4]} ;  //  数据转换给uart
    // uart_tx inst_uart_tx (
    //     .clk                (clk),
    //     .rst_n              (rst_n),
    //     .din                (t_data_uart),
    //     .din_vld            (end_cnt_1s),
    //     .dout               (tx)
    // );


endmodule
        .key_in             (ste_tem_err),
        .pwm                (buzzer)
    );





    ds18b20_driver inst_ds18b20_Driver(
        .clk    (clk)  ,
        .rst_n  (rst_n),
        .dq     (dq)  , 
        .t_data (t_data)   
    );


    sel_driver inst_sel_driver (
        .clk                (clk),
        .rst_n              (rst_n), 
        .dis_data           (dis_data),         
        .sel                (sel),     
        .dig                (dig)  
    );

    

    ctrl inst_strl (

    .t_data    (t_data),
    .dis_data   (dis_data),
    .en         (beep_en),
    .clk        (clk),
    .rst_n      (rst_n),
    .tx1         (tx)
    );


    // assign t_data_uart = {1'b0,t_data[10:4]} ;  //  数据转换给uart
    // uart_tx inst_uart_tx (
    //     .clk                (clk),
    //     .rst_n              (rst_n),
    //     .din                (t_data_uart),
    //     .din_vld            (end_cnt_1s),
    //     .dout               (tx)
    // );


endmodule